package com.qire.other.push;

import android.content.Context;
import android.content.Intent;
import android.net.Uri;

import org.json.JSONException;
import org.json.JSONObject;

import cn.jpush.android.api.CmdMessage;
import cn.jpush.android.api.CustomMessage;
import cn.jpush.android.api.JPushMessage;
import cn.jpush.android.api.NotificationMessage;
import cn.jpush.android.service.JPushMessageReceiver;

/**
 * 使用请参考 https://docs.jiguang.cn//jpush/client/Android/android_api/#new-callback
 */
public class JCustomPushMessageReceiver extends JPushMessageReceiver {

    /**
     * 注册成功回调
     * @param context 应用的 Application Context。
     * @param registrationId 注册id
     */
    @Override
    public void onRegister(Context context, String registrationId) {
        super.onRegister(context, registrationId);
    }

    /**
     * 长连接状态回调
     * @param context 应用的 Application Context。
     * @param isConnected 长连接状态
     */
    @Override
    public void onConnected(Context context, boolean isConnected) {
        super.onConnected(context, isConnected);
    }

    /**
     * 交互事件回调 <br />
     * cmdMessage 说明：<br />
     * <pre>
     *     cmd    |  errorCode  |       msg                 |       DESCRIPTION
     *     0      |  失败code   |    失败信息                 |        注册失败
     *     1000   |  0          |   错误信息                 |     自定义消息展示错误
     *     2003   |  0 / 1      |   not stop / stopped      |   isPushStopped 异步回调
     *     2004   |  0 / 1      |   connected / not connect |   getConnectionState 异步回调
     *     2005   |  0          |   对应 rid                 |    getRegistrationID 异步回调
     *     2006   |  0          |   set success             |       onResume 设置回调
     *     2007   |  0          |   set success             |       onStop 设置回调
     *     10000  |  0          |   无                       |厂商 token 注册回调，通过 extra 可获取对应 platform 和 token 信息
     * </pre>
     * @param context 应用的 Application Context。
     * @param cmdMessage 交互事件回调信息。
     */
    @Override
    public void onCommandResult(Context context, CmdMessage cmdMessage) {
        super.onCommandResult(context, cmdMessage);
    }

    /**
     * alias 相关的操作会在此方法中回调结果。
     * @param context
     * @param jPushMessage
     */
    @Override
    public void onAliasOperatorResult(Context context, JPushMessage jPushMessage) {
        super.onAliasOperatorResult(context, jPushMessage);
        switch (jPushMessage.getErrorCode()) {
            case 0:
                // 成功
                PushManage.removeTagAliasActionCacheBy(jPushMessage.getSequence());
                break;
            case 6002:
            case 6022:
                // 返回的错误码为6002 超时,6014 服务器繁忙,都建议延迟重试
                PushManage.retryActionIfNeeded(jPushMessage.getSequence());
                break;
        }
    }

    /**
     * 收到自定义消息回调 <br />
     * 如果需要在旧版本的 Receiver 接收 cn.jpush.android.intent.MESSAGE_RECEIVED 广播可以不重写此方法，
     * 或者重写此方法且调用 super.onMessage 如果重写此方法，没有调用super，则不会发送广播到旧版本Receiver
     * @param context 应用的 Application Context。
     * @param customMessage 接收自定义消息内容
     */
    @Override
    public void onMessage(Context context, CustomMessage customMessage) {
        super.onMessage(context, customMessage);
    }

    /**
     * 收到通知回调 <br />
     * 如果需要在旧版本的 Receiver 接收 cn.jpush.android.intent.NOTIFICATION_RECEIVED 广播可以不重写此方法，
     * 或者重写此方法且调用 super.onNotifyMessageArrived 如果重写此方法，没有调用super，则不会发送广播到旧版本Receiver
     * @param context 应用的 Application Context。
     * @param notificationMessage 接收到的通知内容
     */
    @Override
    public void onNotifyMessageArrived(Context context, NotificationMessage notificationMessage) {
        super.onNotifyMessageArrived(context, notificationMessage);
    }

    /**
     * 点击通知回调 <br />
     * 如果需要在旧版本的 Receiver 接收 cn.jpush.android.intent.NOTIFICATION_OPENED 广播
     * 可以不重写此方法，或者重写此方法且调用 super.onNotifyMessageOpened 如果重写此方法，没有调用super，则不会发送广播到旧版本Receiver
     * @param context 应用的 Application Context。
     * @param notificationMessage 点击的通知内容
     */
    @Override
    public void onNotifyMessageOpened(Context context, NotificationMessage notificationMessage) {

//        NotificationMessage{notificationId=524157809, msgId='58547024034704830', appkey='e090da1269d1e5ad499a917e',
//            notificationContent='testmsg4_id1000001382', notificationTitle='testmsg4_id1000001382' }

        try {
            // notificationExtras = '{"r":"backend push","url":"qrbridge:\/\/book_shelf"}'
            String deeplink = new JSONObject(notificationMessage.notificationExtras).getString("url");
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setData(Uri.parse(deeplink));
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP );
            context.startActivity(intent);
        } catch (JSONException e) {
            super.onNotifyMessageOpened(context, notificationMessage);
            e.printStackTrace();
        }
    }

    /**
     * 清除通知回调<br />
     * 说明: <br />
     * 1.同时删除多条通知，可能不会多次触发清除通知的回调 <br />
     * 2.只有用户手动清除才有回调，调接口清除不会有回调 <br />
     * @param context 应用的 Application Context。
     * @param notificationMessage 清除的通知内容
     */
    @Override
    public void onNotifyMessageDismiss(Context context, NotificationMessage notificationMessage) {
        super.onNotifyMessageDismiss(context, notificationMessage);
    }

    /**
     * 通知未展示的回调
     * 说明:
     * 1.3.5.8之后支持推送时指定前台不展示功能，当通知未展示时，会回调该接口
     * @param context 应用的 Application Context。
     * @param notificationMessage 未展示的通知内容
     */
    @Override
    public void onNotifyMessageUnShow(Context context, NotificationMessage notificationMessage) {
        super.onNotifyMessageUnShow(context, notificationMessage);
    }

}
